////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxcsljumptable.cpp
///
/// @brief Defines the jump table instances for different CSL implementations.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "camxcsljumptable.h"
#include "camxincs.h"

/// @brief  Helper object to initialize and expose the right CSL implementation.
extern CSLModeManager* g_pCSLModeManager;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetCSLJumpTableIFH
///
/// @brief  Get the CSL jump table for CSL IFH mode. This is defined in the IFH mode implementation.
///
/// @return Pointer to the jump table of CSL IFH mode
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLJumpTable* GetCSLJumpTableIFH(void);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetCSLJumpTablePresil
///
/// @brief  Get the CSL jump table for CSL presil mode. This is defined in presil mode implementation.
///
/// @return Pointer to the jump table of CSL presil mode
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLJumpTable* GetCSLJumpTablePresil(void);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetCSLJumpTableHw
///
/// @brief  Get the CSL jump table for CSL Hw mode. This is defined in Hw mode implementation.
///
/// @return Pointer to the jump table of CSL Hw mode
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLJumpTable* GetCSLJumpTableHw(void);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GetCSLMode
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLMode GetCSLMode(void)
{
    CAMX_ASSERT_MESSAGE(NULL != g_pCSLModeManager, "CSL not initialized");
    return g_pCSLModeManager->Mode();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CSLModeManager::CSLModeManager
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLModeManager::CSLModeManager(
    const CSLInitializeParams* pInitParams)
{
    m_emulatedSensorParams = pInitParams->emulatedSensorParams;

    switch (pInitParams->mode)
    {
        case CSLMode::CSLIFHEnabled:
            m_pJumpTable            = GetCSLJumpTableIFH();
            m_mode                  = static_cast<CSLMode>(pInitParams->mode);
            break;
#if !defined(ANDROID)
#if DEBUG
#if defined(_WIN64) || defined(_LP64)
        case CSLMode::CSLPresilEnabled:
        case CSLMode::CSLPresilRUMIEnabled:
            m_pJumpTable            = GetCSLJumpTablePresil();
            m_mode                  = static_cast<CSLMode>(pInitParams->mode);
            break;
#endif // _WIN64 || _LP64
#endif // DEBUG
#else  // ANDROID
        case CSLMode::CSLHwEnabled:
            m_pJumpTable            = GetCSLJumpTableHw();
            m_mode                  = static_cast<CSLMode>(pInitParams->mode);
            break;
#endif // ANDROID
        default:
            CAMX_ASSERT_ALWAYS_MESSAGE("Unsupported CSL mode on given operating system");
            //
            // Punt down to an available jump table (if possible PRESIL to cover device testing)
            //
            m_pJumpTable            = GetCSLJumpTableIFH();
            m_mode                  = CSLMode::CSLIFHEnabled;
#if !defined(ANDROID)
#if DEBUG
#if defined(_WIN64) || defined(_LP64)
            m_pJumpTable            = GetCSLJumpTablePresil();
            m_mode                  = CSLMode::CSLPresilEnabled;
#endif // _WIN64 || _LP64
#endif // DEBUG
#endif // ANDROID
            break;
    }

    CAMX_ASSERT(NULL != m_pJumpTable);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CSLModeManager::~CSLModeManager
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSLModeManager::~CSLModeManager()
{

}